Dependency Inversion Principle (DIP) হল SOLID নীতিগুলোর মধ্যে একটি, যা অবজেক্ট-ওরিয়েন্টেড ডিজাইন এবং সফটওয়্যার উন্নয়নে ব্যবহৃত হয়। DIP-এর মূল উদ্দেশ্য হল উচ্চ স্তরের মডিউলগুলোর এবং নিম্ন স্তরের মডিউলগুলোর মধ্যে নির্ভরশীলতা হ্রাস করা, যাতে কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
Dependency Inversion Principle (DIP) এর ধারণা
DIP দুটি মূল নিয়মকে নির্দেশ করে:
উচ্চ স্তরের মডিউলগুলি নিম্ন স্তরের মডিউলগুলির উপর নির্ভরশীল হওয়া উচিত নয়:
- পরিবর্তে, উভয়কেই বিমূর্তকরণের (abstraction) উপর নির্ভরশীল হওয়া উচিত। এর মানে হলো, উচ্চ স্তরের মডিউলগুলি কোনও নির্দিষ্ট নিম্ন স্তরের মডিউলের উপর নির্ভর না করে, বরং একটি সাধারণ ইন্টারফেস বা বিমূর্তকরণ ব্যবহার করতে হবে।
বিমূর্তকরণগুলি নির্ভরশীলতার ভিত্তি হওয়া উচিত:
- উপাদানগুলির মধ্যে সম্পর্ক স্থাপন করার জন্য ইন্টারফেস এবং বিমূর্তকরণের ব্যবহার করা উচিত, যা নির্ভরশীলতা পরিচালনা করতে সাহায্য করে।
DIP এর গুরুত্ব
নমনীয়তা বৃদ্ধি:
- DIP ব্যবহার করলে কোডের নমনীয়তা বৃদ্ধি পায়, কারণ পরিবর্তন করতে হলে শুধুমাত্র নিম্ন স্তরের মডিউল পরিবর্তন করতে হবে। উচ্চ স্তরের মডিউল অপরিবর্তিত থাকবে।
পুনঃব্যবহারযোগ্যতা:
- নিম্ন স্তরের মডিউলগুলি উচ্চ স্তরের মডিউলের পরিবর্তে বিমূর্তকরণের উপর নির্ভর করার কারণে, তারা বিভিন্ন প্রজেক্টে পুনঃব্যবহারযোগ্য হতে পারে।
রক্ষণাবেক্ষণ সহজ:
- DIP অনুসরণ করলে কোড রক্ষণাবেক্ষণ করা সহজ হয়, কারণ নির্ভরশীলতা কমানো হয়। ফলে, কোনও একটি অংশ পরিবর্তন করলে বাকী অংশগুলিতে প্রভাব পড়বে না।
ইন্টারফেসের মাধ্যমে বিচ্ছিন্নতা:
- DIP ইন্টারফেসের মাধ্যমে মডিউলগুলির মধ্যে বিচ্ছিন্নতা নিশ্চিত করে, যা সিস্টেমের স্থায়িত্ব বাড়ায়।
উদাহরণ
ধরি, একটি সরল পেইন্টিং অ্যাপ্লিকেশন রয়েছে যেখানে একটি Brush ক্লাস এবং একটি Painter ক্লাস আছে। যদি Painter সরাসরি Brush ক্লাসের উপর নির্ভরশীল হয়, তবে এর পরিবর্তে যদি Brush-এর জন্য একটি ইন্টারফেস ব্যবহার করা হয়, তাহলে DIP বজায় থাকবে।
DIP অনুসরণ না করা:
class Brush:
def paint(self):
print("Painting with brush")
class Painter:
def __init__(self):
self.brush = Brush() # Tight Coupling with Brush
def create(self):
self.brush.paint()
DIP অনুসরণ করা:
from abc import ABC, abstractmethod
# Interface for Brush
class BrushInterface(ABC):
@abstractmethod
def paint(self):
pass
class Brush(BrushInterface):
def paint(self):
print("Painting with brush")
class Painter:
def __init__(self, brush: BrushInterface): # Depend on abstraction
self.brush = brush
def create(self):
self.brush.paint()
# Client code
brush = Brush()
painter = Painter(brush) # Injecting dependency
painter.create()
উপসংহার
Dependency Inversion Principle (DIP) একটি মৌলিক নীতি যা অবজেক্ট-ওরিয়েন্টেড ডিজাইনকে আরও কার্যকরী, নমনীয় এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। DIP অনুসরণ করার মাধ্যমে সফটওয়্যার ডেভেলপাররা তাদের কোডের গুণগত মান বাড়াতে এবং প্রকল্পগুলির মধ্যে পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে পারেন। এটি আধুনিক সফটওয়্যার উন্নয়নের একটি গুরুত্বপূর্ণ অংশ।
Read more